/*
 * Copyright (C) 2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup Drm
 * @{
 *
 * @brief 提供数字版权保护能力的API。
 * @kit Drm.
 * @since 11
 * @version 1.0
 */

/**
 * @file native_mediakeysystem.h
 * @brief 定义Drm MediaKeySystem API。提供以下功能：
 * 查询是否支持特定的drm，创建媒体密钥会话，获取和设置配置，
 * 获取统计信息，获取内容保护级别，生成提供请求，处理提供响应，
 * 事件监听，获取内容防护级别，管理离线媒体密钥等。
 * @library libnative_drm.z.so
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */

#ifndef OHOS_DRM_NATIVE_MEDIA_KEY_SYSTEM_H
#define OHOS_DRM_NATIVE_MEDIA_KEY_SYSTEM_H

#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include "native_drm_err.h"
#include "native_drm_common.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 事件触发时将调用的回调。
 * @param eventType 事件类型。
 * @param eventInfo MediaKeySystem获取到的事件信息。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
typedef  Drm_ErrCode (*MediaKeySystem_Callback)(DRM_ListenerType eventType, DRM_Uint8CharBufferPair *eventInfo);
/**
 * @brief 通过MediaKeySystem方案唯一编号获取MediaKeySystem方案名。
 * @param uuid MediaKeySystem方案唯一编号。
 * @param name MediaKeySystem方案名。
 * @param nameLen MediaKeySystem方案名长度。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_GetMediaKeySystemName(const char *uuid, unsigned char **name, int32_t *nameLen);

/**
 * @brief 查询设备是否支持指定MediaKeySystem方案。
 * @param name MediaKeySystem方案名。
 * @return 支持与否。
 * @since 11
 * @version 1.0
 */
bool OH_MediaKeySystem_IsSupported(const char *name);
/**
 * @brief 查询设备是否支持指定MediaKeySystem方案、指定媒体类型。
 * @param name MediaKeySystem方案名。
 * @param mimeType 媒体类型。
 * @return 支持与否。
 * @since 11
 * @version 1.0
 */
bool OH_MediaKeySystem_IsSupported2(const char *name, const char *mimeType);
/**
 * @brief 查询设备是否支持指定MediaKeySystem方案、指定媒体类型、指定内容保护级别。
 * @param name MediaKeySystem方案名。
 * @param mimeType 媒体类型。
 * @param contentProtectionLevel 内容保护级别。
 * @return 支持与否。
 * @since 11
 * @version 1.0
 */
bool OH_MediaKeySystem_IsSupported3(const char *name, const char *mimeType,
    DRM_ContentProtectionLevel contentProtectionLevel);

/**
 * @brief 根据方案名创建一个MediaKeySystem实例。
 * @param name MediaKeySystem方案名
 * @param mediaKeySystem MediaKeySystem实例。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * 达到MediaKeySession实例最大数量返回{@link DRM_ERR_MAX_SYSTEM_NUM_REACHED}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_Create(const char *name, MediaKeySystem **mediaKeySystem);
/**
 * @brief 通过配置名设置MediaKeySystem的配置值。
 * @param mediaKeySystem MediaKeySystem实例。
 * @param configName 字符串类型配置名。
 * @param value 字符串形式配置值。
 * @param valueLen 字符串形式配置值长度。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_SetConfigurationString(MediaKeySystem *mediaKeySystem,
    const char *configName, const char *value);
/**
 * @brief 通过配置名获取MediaKeySystem的配置值。
 * @param mediaKeySystem MediaKeySystem实例。
 * @param configName 字符串类型配置名。
 * @param value 字符串形式配置值。
 * @param valueLen 字符串形式配置值长度。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_GetConfigurationString(MediaKeySystem *mediaKeySystem,
    const char *configName, char **value, int32_t *valueLen);
/**
 * @brief 通过配置名设置MediaKeySystem的配置值。
 * @param mediaKeySystem MediaKeySystem实例。
 * @param configName 字符串类型配置名。
 * @param value 字节数组形式配置值。
 * @param valueLen 字节数组形式配置值长度。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_SetConfigurationByteArray(MediaKeySystem *mediaKeySystem,
    const char *configName, DRM_Uint8Buffer *value);
/**
 * @brief 通过配置名获取MediaKeySystem的配置值。
 * @param mediaKeySystem MediaKeySystem实例。
 * @param configName 字符串类型配置名。
 * @param value 字节数组形式配置值。
 * @param valueLen 字节数组形式配置值长度。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_GetConfigurationByteArray(MediaKeySystem *mediaKeySystem,
    const char *configName, unsigned char **value, int32_t *valueLen);
/**
 * @brief 获取MediaKeySystem的度量统计信息。
 * @param mediaKeySystem MediaKeySystem实例。
 * @param statistics 度量统计信息。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_GetStatistics(MediaKeySystem *mediaKeySystem, DRM_Statistics **statistics);
/**
 * @brief 获取MediaKeySystem支持的最大内容保护级别。
 * @param mediaKeySystem MediaKeySystem实例。
 * @param contentProtectionLevel 内容保护级别。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_GetMaxContentProtectionLevel(MediaKeySystem *mediaKeySystem,
    DRM_ContentProtectionLevel *contentProtectionLevel);
/**
 * @brief 设置MediaKeySystem回调监听。
 * @param mediaKeySystem MediaKeySystem实例。
 * @param callback 设置到MediaKeySystem中的回调函数。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_SetMediaKeySystemCallback(MediaKeySystem *mediaKeySystem,
    MediaKeySystem_Callback callback);

/**
 * @brief 创建一个MediaKeySession实例。
 * @param mediaKeySystem 用来创建MediaKeySession实例的MediaKeySystem实例。
 * @param level 内容保护级别。
 * @param mediaKeySession MediaKeySession实例。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * 达到MediaKeySession实例最大数量返回{@link DRM_ERR_MAX_SESSION_NUM_REACHED}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_CreateMediaKeySession(MediaKeySystem *mediaKeySystem,
    DRM_ContentProtectionLevel *level, MediaKeySession **mediaKeySession);

/**
 * @brief 生成设备证书请求。
 * @param mediaKeySystem MediaKeySystem实例。
 * @param request Provision请求数据。
 * @param requestLen Provision请求长度。
 * @param defaultUrl Provision服务器URL。
 * @param defaultUrlLen Provision服务器URL长度。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_GenerateKeySystemRequest(MediaKeySystem *mediaKeySystem, unsigned char **request,
    int32_t *requestLen, char **defaultUrl, int32_t *defaultUrlLen);

/**
 * @brief 处理设备证书响应。
 * @param mediaKeySystem MediaKeySystem实例。
 * @param response 设备证书响应。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_ProcessKeySystemResponse(MediaKeySystem *mediaKeySystem,
    DRM_Uint8Buffer *response);

/**
 * @brief 获取离线许可证状态。
 * @param mediaKeySystem MediaKeySystem实例。
 * @param mediaKeyIds 离线许可证Id。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_GetOfflineMediaKeyIds(MediaKeySystem *mediaKeySystem,
    DRM_MediakeyIdArray **mediaKeyIds);

/**
 * @brief 获取离线许可证状态。
 * @param mediaKeySystem MediaKeySystem实例。
 * @param mediaKeyId 许可证Id。
 * @param status 获取到的许可证状态。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_GetOfflineMediaKeyStatus(MediaKeySystem *mediaKeySystem,
    DRM_Uint8Buffer *mediaKeyId, DRM_OfflineMediaKeyStatus *status);

/**
 * @brief 根据许可证Id清理许可证.
 * @param mediaKeySystem MediaKeySystem实例。
 * @param mediaKeyId 许可证Id.
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_ClearOfflineMediaKeys(MediaKeySystem *mediaKeySystem,
    DRM_Uint8Buffer *mediaKeyId);

/**
 * @brief 获取设备证书状态.
 * @param mediaKeySystem MediaKeySystem实例。
 * @param certStatus 获取的设备证书状态。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_GetCertificateStatus(MediaKeySystem *mediaKeySystem,
    DRM_CertificateStatus *certStatus);

/**
 * @brief 销毁MediaKeySystem实例。
 * @param mediaKeySystem 被销毁的MediaKeySystem实例。
 * @return 参数检查失败返回{@link DRM_ERR_INVALID_VAL}, 调用成功返回{@link DRM_ERR_OK}。
 * @since 11
 * @version 1.0
 */
Drm_ErrCode OH_MediaKeySystem_Destroy(MediaKeySystem *mediaKeySystem);


#ifdef __cplusplus
}
#endif

#endif // OHOS_DRM_NATIVE_MEDIA_KEY_SYSTEM_H